package com.mycompany.myapp.dao.spring;

import com.mycompany.myapp.dao.MonstreDao;
import com.mycompany.myapp.dto.Monstre;
import com.mycompany.myapp.dto.MonstrePk;
import com.mycompany.myapp.exceptions.MonstreDaoException;
import java.util.List;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.transaction.annotation.Transactional;

public class MonstreDaoImpl extends AbstractDAO implements ParameterizedRowMapper<Monstre>, MonstreDao
{
	protected SimpleJdbcTemplate jdbcTemplate;

	protected DataSource dataSource;

	/**
	 * Method 'setDataSource'
	 * 
	 * @param dataSource
	 */
	public void setDataSource(DataSource dataSource)
	{
		this.dataSource = dataSource;
		jdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}

	/**
	 * Method 'insert'
	 * 
	 * @param dto
	 * @return MonstrePk
	 */
	@Transactional
	public MonstrePk insert(Monstre dto)
	{
		jdbcTemplate.update("INSERT INTO " + getTableName() + " ( vieActuelleM, vieMaxM, lieuActuelM ) VALUES ( ?, ?, ? )",dto.isVieActuelleMNull()?null:dto.getVieActuelleM(),dto.isVieMaxMNull()?null:dto.getVieMaxM(),dto.isLieuActuelMNull()?null:dto.getLieuActuelM());
		MonstrePk pk = new MonstrePk();
		pk.setIdMonstre( jdbcTemplate.queryForInt("select last_insert_id()") );
		return pk;
	}

	/** 
	 * Updates a single row in the monstre table.
	 */
	@Transactional
	public void update(MonstrePk pk, Monstre dto) throws MonstreDaoException
	{
		jdbcTemplate.update("UPDATE " + getTableName() + " SET idMonstre = ?, vieActuelleM = ?, vieMaxM = ?, lieuActuelM = ? WHERE idMonstre = ?",dto.getIdMonstre(),dto.getVieActuelleM(),dto.getVieMaxM(),dto.getLieuActuelM(),pk.getIdMonstre());
	}

	/** 
	 * Deletes a single row in the monstre table.
	 */
	@Transactional
	public void delete(MonstrePk pk) throws MonstreDaoException
	{
		jdbcTemplate.update("DELETE FROM " + getTableName() + " WHERE idMonstre = ?",pk.getIdMonstre());
	}

	/**
	 * Method 'mapRow'
	 * 
	 * @param rs
	 * @param row
	 * @throws SQLException
	 * @return Monstre
	 */
	public Monstre mapRow(ResultSet rs, int row) throws SQLException
	{
		Monstre dto = new Monstre();
		dto.setIdMonstre( rs.getInt( 1 ) );
		dto.setVieActuelleM( rs.getInt( 2 ) );
		if (rs.wasNull()) {
			dto.setVieActuelleMNull( true );
		}
		
		dto.setVieMaxM( rs.getInt( 3 ) );
		if (rs.wasNull()) {
			dto.setVieMaxMNull( true );
		}
		
		dto.setLieuActuelM( rs.getInt( 4 ) );
		if (rs.wasNull()) {
			dto.setLieuActuelMNull( true );
		}
		
		return dto;
	}

	/**
	 * Method 'getTableName'
	 * 
	 * @return String
	 */
	public String getTableName()
	{
		return "projetrmi.monstre";
	}

	/** 
	 * Returns all rows from the monstre table that match the criteria 'idMonstre = :idMonstre'.
	 */
	@Transactional
	public Monstre findByPrimaryKey(int idMonstre) throws MonstreDaoException
	{
		try {
			List<Monstre> list = jdbcTemplate.query("SELECT idMonstre, vieActuelleM, vieMaxM, lieuActuelM FROM " + getTableName() + " WHERE idMonstre = ?", this,idMonstre);
			return list.size() == 0 ? null : list.get(0);
		}
		catch (Exception e) {
			throw new MonstreDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the monstre table that match the criteria ''.
	 */
	@Transactional
	public List<Monstre> findAll() throws MonstreDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idMonstre, vieActuelleM, vieMaxM, lieuActuelM FROM " + getTableName() + " ORDER BY idMonstre", this);
		}
		catch (Exception e) {
			throw new MonstreDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the monstre table that match the criteria 'idMonstre = :idMonstre'.
	 */
	@Transactional
	public List<Monstre> findWhereIdMonstreEquals(int idMonstre) throws MonstreDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idMonstre, vieActuelleM, vieMaxM, lieuActuelM FROM " + getTableName() + " WHERE idMonstre = ? ORDER BY idMonstre", this,idMonstre);
		}
		catch (Exception e) {
			throw new MonstreDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the monstre table that match the criteria 'vieActuelleM = :vieActuelleM'.
	 */
	@Transactional
	public List<Monstre> findWhereVieActuelleMEquals(int vieActuelleM) throws MonstreDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idMonstre, vieActuelleM, vieMaxM, lieuActuelM FROM " + getTableName() + " WHERE vieActuelleM = ? ORDER BY vieActuelleM", this,vieActuelleM);
		}
		catch (Exception e) {
			throw new MonstreDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the monstre table that match the criteria 'vieMaxM = :vieMaxM'.
	 */
	@Transactional
	public List<Monstre> findWhereVieMaxMEquals(int vieMaxM) throws MonstreDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idMonstre, vieActuelleM, vieMaxM, lieuActuelM FROM " + getTableName() + " WHERE vieMaxM = ? ORDER BY vieMaxM", this,vieMaxM);
		}
		catch (Exception e) {
			throw new MonstreDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the monstre table that match the criteria 'lieuActuelM = :lieuActuelM'.
	 */
	@Transactional
	public List<Monstre> findWhereLieuActuelMEquals(int lieuActuelM) throws MonstreDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idMonstre, vieActuelleM, vieMaxM, lieuActuelM FROM " + getTableName() + " WHERE lieuActuelM = ? ORDER BY lieuActuelM", this,lieuActuelM);
		}
		catch (Exception e) {
			throw new MonstreDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns the rows from the monstre table that matches the specified primary-key value.
	 */
	public Monstre findByPrimaryKey(MonstrePk pk) throws MonstreDaoException
	{
		return findByPrimaryKey( pk.getIdMonstre() );
	}

}
